library(DT)
library(plyr)
library(reactable)
library(tidyverse)
library(glpkAPI)
library(psych)
library(irtoys)
library(ltm)
library(plink)

1. 項目反応理論 (IRT) の概要

1.1 項目反応理論とは

  • 項目反応理論 (Item Response Theory: IRT) とはテスト理論 (test theory) の一つであり、大規模能力試験の作成・運用におけるグローバル・スタンダード
  • テスト理論は計量心理学(psychometrics)を軸に体系化されてきた
  • 項目に対する反応を統計モデル(確率モデル)で表現する手法
  • Lord(1952)によってその基本的な枠組みが整備され、発展してきた
  • ある受験者がある項目に正答する確率を、項目反応理論と呼ばれる統計モデルで表現する数理手法
  • 受験者が受けた試験問題の難易度や、受験者集団間の能力分布に左右されない公平な評価が可能になる
  • IRTはテストだけでなく、測定の性能評価や効率化等を目的として、心理学研究における心理尺度の作成・改良のためにも活用されている
  • 測定対象者ごとに一次元の尺度を仮定し、その潜在的な尺度上での「潜在特性値」を推定
  • 同時に、項目に対していくつかの種類の項目母数(項目パラメタ)を推定

項目反応理論の主眼
・「能力がこのくらいの人が、この問題を正解できる確率はどれくらいか?」 という問いに答えること

  • 横軸に「受験者の能力」をとる
  • 縦軸に「正解する確率」をとる
    ・問題の難易度が同じなら・・・
  • 受験者の能力が低いほど、正解の確率は低い
  • 受験者の能力が高いど、正解の確率は高い

  • この関係を「ロジスティック回帰分析」で推定する.

項目反応理論の利点

1. 個別的な精度評価ができる

  • 従来の精度評価・・・「このテストには±5点の誤差がある」(=全体的な評価)
  • IRTの精度評価・・・「高能力群では±2点の誤差、低能力群では±10点の誤差がある」(=個別的な精度評価)

2. テストの測定精度の情報を、受験者の能力別に評価できる

  • 真に有益な問題を合理的に取捨選択できる
  • 問題の精度を担保しつつ、テストの短縮版が作成できる
  • テストの難易度や得点分布を事前にコントロールできる
  • 受験者ごとに異なる問題を解いても、得点の信頼性が保証される
  • 受験者の能力・回答状況に応じた問題の出題が可能
    → コンピュータ適応型テスト (Computer-adaptive Testing: CAT) ができる

具体的な分析方法

  • 問題と回答者のマトリックスに正解=1、不正解=0のパターンを作る

  • そのパターンに最も近くなるロジスティック曲線を問題の数だけ当てはめる

  • その際、確率的に最もありそうな基準(=尤度(ゆうど))を使う

  • 受験者の能力と、問題の難易度も推定可能
    → 良問と悪問題が区別できる

「等化」を使う
  • IRTでは、出題した項目の「項目母数」(困難度や識別力)を根拠に、受験者の潜在特性値を推定
    → 潜在特性値は原点と単位を任意に設定可能
    → 基準となる尺度を定義し、それに他の尺度を乗せることができる(=等化
    → 異なるテスト間で共通の意味をもつスコアを算出できる
    → テストの内容が異なっても同じ土俵で能力が比較可能
項目バンク (item bank) を作る
  • IRTによって推定された項目母数を、項目内容と共に記録
    → 後日、再出題し、受験者の学力レベルに応じた項目群を使ことが可能
  • この項目群のデータバンクのことを項目バンクと呼ぶ
  • 項目母数からテスト情報関数を求める
    → 実施するテストがどの程度の学力レベルの受験者向けなのかがわかる
    → 受験者集団に依存しない評価指数を使った項目単位での検討が可能になる
Adaptive IRT Test を使う

→ 受験者の解答結果しだいで出題問題を変える
→ 受験者の能力を推定する上で最も適切な問題を出題できる
→ 少ない問題・少ない時間で、受験者の能力を推定できる

テスト項目が適切かどうかを統計的に評価する
主な方法:
  1. テスト得点との相関分析
  2. 注意係数の算出
  3. 項目反応理論の適用
  • 受験者を成績に基づいて、上位群と下位群に分ける
  • 各選択肢の選択率を計算
  • それぞれの選択肢が、適切に上位群と下位群を識別できるかどうかチェック
    → 必要なら選択肢を修正する
  • 相関係数と因子分析を用いてテストの内的一貫性を評価する
  • 項目反応理論を使って、識別力の低い項目を特定する

1.2 項目反応理論を使う理由

  • 古典的テスト理論には2つの大きな問題があるため

古典的テスト理論 (classical test theory) が直面する2つの問題 標本依存性 (sample dependence) の問題
項目依存性 (item dependence) の問題

標本依存性 (sample dependence) の問題

  • A 学校 の X さんの偏差値が50
  • B 学校 の Y さんの偏差値が60
  • 偏差値の高い Y さんの方が学力が高いといえるか?
  • 必ずしもそうとはいえない

その理由:

・受験者集団の能力が異なるから

  • もし、A学校とB学校のレベルが同一なら → 偏差値60のYさんの学力が高い
  • しかし、A学校の方がB学校より学力が高ければ
    → 偏差値60のYさんより、偏差値50のXさんの方が学力が高い可能性がある

→ テストの困難度の評価が、そのテストを受けたサンプル(集団)のレベルに依存する
・受験者集団のレベルが高い → 個々の受験者のテスト得点が高い → 集団全体の平均点が高い
・受験者集団のレベルが低い → 個々の受験者のテスト得点が低い → 集団全体の平均点が低い

  • このことをテスト得点の標本依存性という
    → 異なる集団を比較する際には注意が必要

項目依存性 (item dependence) の問題

  • A中学校で去年実施したテストの平均点が50点
  • A中学校で今年実施したテストの平均点が70点
  • この場合、A中学校の生徒の学力が伸びたとはいえるか
  • 必ずしもそうとはいえない

その理由:

・問題の困難度(難しさ)が異なるから

  • もし、去年と今年の問題が同一なら → 去年より20点学力が伸びた

  • しかし、今年より去年の問題の方が難しいなら
    → 今年のテストの平均点より、去年のテストの平均点は低い
    → 平均値が低い去年の生徒の方が学力が高い可能性がある

  • このことをテスト得点の項目依存性という
    → 異なるテストを比較することができない

  • 受験者のテスト得点は、テスト個々の問題(=項目)の困難度によっても影響を受ける

解決策:

→ テストに含まれる問題(= 項目)の難しさ(= 困難度)と受験者の能力を別々に推定し、同じものさしの上で評価する

  • 具体的には、項目特性曲線 (item characteristice curve: ICC) を使って、テストに含まれる「項目の難しさ」と「受験者の能力」を別々に推定
    → 同じ物差しを使って評価できる

まとめ

テストの素点を偏差値に換算したとしても、学校ごとの学力分布が異なる場合、受験者の能力を正しく比較できない

1.3 項目反応理論 (IRT) でできること

  • 従来のテスト理論だと、A学校で実施したテストの平均点が70点だった時
  • 従来のテスト理論だと、なぜ平均点が70点だったのかその理由がわからない
    ・生徒の学力が高かったためなのか?
    ・問題が易しすぎたからなのか?

  • しかし、項目反応理論を使うと、平均点が70点だった理由の手がかりがつかめる
    ・生徒の学力平均=2.2
    ・問題の難しさの平均=0.7

理論別スコアの表示方法と解釈

古典的テスト理論 項目反応理論
素点 潜在特性値 \(θ\)(シータ)= 受験者の能力
偏差値 項目特性(問題の困難度・識別力)
項目特性と受験者の能力が交絡 項目特性と受験者の能力を別々に表現できる
→ 困難度と受験者の能力を区別できない
  • 潜在特性値 \(θ\)は、受験者集団の能力分布に依存しないスコア
  • 項目特性とは項目の困難度識別力のこと
  • 問題の困難度や識別力である「項目特性」を根拠に、潜在特性値 \(θ\)(=受験者の能力)を推定する

項目特性曲線 (item characteristice curve: ICC)

  • ICCは、受験者の能力レベル \(θ\) に対して正答確率 \(P(θ)\) がどのように変化するかを示す
  • 横軸・・・潜在特性値 \(θ\)(潜在的に仮定された受験者の「能力」)
  • 縦軸・・・正解する確率
  • 受験者の正誤データから、問題(項目)1つひとつについて項目反応曲線を推定
    → 項目の困難度によらない受験者の能力値を推定できる
  • ICCを使うと、以下の2つの指標が明確になる
困難度(Difficulty Parameter)

→ ICCの曲線が横軸上のどの位置で50%の正答率を持つかを見ることで、その問題の難しさを判断できる

識別力(Discrimination Parameter)

→ 曲線の傾きが大きいほど、能力の低い受験者と高い受験者をうまく区別できる項目であることがわかる

  • 5つの項目(=問題)に関する下の項目特性曲線について考えてみる

  • 問1(黒色)は能力が低い受験者でも正解率が高い、比較的易しい問題.

  • 問3(緑色)は受験者の能力がある程度高くないと、正解できない比較的難しい問題

  • 問題を難しい順から易しい順位並びかえると、3 → 2 → 4 → 5 → 1 となる

  • 曲線の傾きが最も大きい問題は 3
    → 能力の低い受験者と高い受験者をうまく区別できる問題は 3

  • 次の節では、上の項目特性曲線の解釈についてさらに考えてみる

1.4 項目反応理論 (IRT) が満たすべき仮定

  • IRTに基づく分析を実行するためには3つの仮定を満たす必要がある
仮定 内容
1. 局所独立性
2. 正答確率の単調増加性 問題の難易度の適切性
3. データの適合度 項目反応モデルに関するデータの適合度

2. IRTの考え方

2.1 IRTによる尺度化  

  • 「受験者 \(i\) における \(j\) 番目における項目に対する正誤を示すデータ \(u_{ij}\)の意味

  • テスト理論の出発点は「正誤データ」(1は正解、0は不正解)

  • 受験者が 3 人おり、1番目がA、2番目がB、3番目がC → 受験者の順番を \(i\) で表す

  • 項目が 3 つあり、1番目がQ1、2番目がQ2、3番目がQ3 → 項目の順番を\(j\)で表す

  • \(u_{ij}\) は「i番目の受験者」の「j番目の問題」の「正誤結果」を示す

  • 従って、\(u_{12}\) は 1番目の受験者の2番目の問題の正誤結果を示す
    → つまり、正誤データ \(u_{ij}\) の正誤結果は 1

  • 下の左図は視力検査に使う「ランドルト環」と呼ばれる表
  • 参加者に様々な大きさの「C」の形をした刺激(ランドルト環)を提示して、「C」の切れ目の方向(上下左右)を回答させる

  • この検査データを表にまとめたものが上の左図
  • 「ガットマンスケール」と呼ばれている
  • 目の検査を受けたのはA, B, C, …., L までの12人
  • 「C」の大きさの「見やすさ」は最大の 0.1(最上位)から最小の 1.5(最下位)まで変化する
    → この「見やすさ」が刺激
  • A さんは全ての項目で正解 (= 1) => 視力が良い
  • B さんは「見やすさ = 1.5」以外は全ての項目で正答 (= 1)
  • L さんは全ての項目で不正答 (= 0) => 視力が悪い
  • 「ガットマンスケール」では、物理的な量の大小(=刺激の大きさ)を心理量(=視力)に置き換えるための尺度を構成している
  • 各刺激に対する正答率と参加者の「真の視力」の間にどのようの対応関係があるかを適切に記述
    → 刺激が参加者の視力をどの程度識別できるかの指標(=識別力)を与えることができる
  • IRTでは、潜在特性値 \(θ\)(ここでは視力)によって、正答する確率を記述する
  • 項目の正誤データを 2 値データ (0 or 1) とみなし、因子分析により一因子を抽出する操作を行う
    → 受験者ごとに算出されるのが潜在特性値 \(θ\)(ここでは「視力」)
  • 潜在特性値は原点と単位に不定性がある
    → 平均 = 0、標準偏差 = 1 とすることで、標準化得点(z値)のように扱うことができる
    → 分析結果の解釈が容易

検査の正答確率と潜在特性値 \(θ\)(視力)を項目特性曲線 (ICC) を使って可視化

  • ランドルト環を使った視力検査の正答確率と潜在特性値 \(θ\)(視力)の結果を可視化してみる
  • 縦軸・・・正答する確率 (0 〜 1)
  • 横軸・・・受験者の潜在特性値 \(θ\)(視力)
  • 「C」の「見やすさ」を困難度 (b) と定義
    → 見やすい「C」ほど困難度 (b) の値は低い

  • 受験者の視力が同一の場合、例えば、能力θ= 0の時
    → 問題の困難度 (b) ごとに正答する確率が異なる
    ・「困難度 b = 1.0」(見にくい「C」)に正答する確率は0.1程度
    ・「困難度 b = -0.5」(見やすい「C」)に正答する確率は0.7程度

2.2 モデル(二値データ)

  • 正答確率と潜在特殊性を関連づけるモデルは次の 3 つ
  • 項目特性曲線 (Item Characteristic Curb: ICC)
  • 項目反応関数 (Item Response Function: IRF)
詳細
\(P(\theta)\) 能力θを持つ受験者が、ある項目に正答する確率
\(\theta\) 受験者の能力。通常、平均0・標準偏差1の正規分布に従うと仮定される
\(a\) 識別力(discrimination)パラメータ
\(b\) 困難度(difficulty)パラメータ
\(c\) 推測(guessing)パラメータ(最低正答確率、通常0〜0.25程度)
1 パラメタ・ロジスティックモデル (1PLM): ラッシュモデル (Rasch Model)

\[P(\theta) = \frac{1}{1 + exp[-(\theta-b)]}\]

2 パラメタ・ロジスティックモデル (2PLM)

\[P(\theta) = \frac{1}{1 + exp[-a(\theta-b)]}\]

3 パラメタ・ロジスティックモデル (3PLM)

\[P(\theta) = c + \frac{1-c}{1 + exp[-a(\theta-b)]}\]

  • ICCで記述される正答確率・・・項目母数で条件付けられた、ある潜在特性値における正答確率
    \(P(\theta)\) のように表記する
  • 例えば、識別力 \(a = 0.8\)、困難度 \(b = 2.0\) の場合の正答確率を、3つの当て推量指数(0, 0.3, 0.5)ごとに正答確率を可視化してみる (3パラメタ・ロジスティックモデル)

  • c = 0 だと当て推量で正答する確率が 0% → 受験者の視力が正しく測定できる
  • c = 0.5 だと当て推量で正答する確率が 50% → 受験者の視力が弱くても正答する確率が上がる
    → 受験者の視力が正しく測定できない
  • ICCを仮定したモデルでは、ある人の正誤データ \(u_j\) が得られる確率を次のように表す

\[u_x^2 = \frac{\sum_{i=1}^n (x_i - \bar{x})^2}{N-1}\]

\[P(u_1, u_2,..., u_n|\theta) = Π_{j=1}^nP_j(\theta)^{u_j}(1-P_j(\theta))^{1-u_j}\]

  • データが得られる \(\theta\) の条件付き確率が、ICCの積になっている
  • \(\theta\) の値を固定したとき、項目相互間で解答が独立に生じている仮定を満たす必要がある
→ 局所独立の仮定 = 一次元性の仮定

一次元性の仮定 各項目の正誤が、\(\theta\) の値の大小によってのみばらつく

  • つまり「受験者が正解するかどうかは、受験者の能力だけで決まる」という仮定である

2.3 母数の推定

2.3.1 母数の推定方法

1 段階: 正誤データを用いて項目母数を推定

2 段階:潜在特性値の推定

周辺最大尤度法

  • 潜在特性値の分布を用いて推定
  • しかし、潜在特性値そのものは推定せず、局外母数とみなす
  • EMアルゴリズムを使う
  • 最尤法では、データを所与とした時に、尤度を最大化するような母数を求める
  • 最大化された尤度は、モデルの当てはまりの良さを表す 赤池情報基準 (Akaike Information Criterion: AIC) 等の情報量基準を計算するのに使われる
  • 最尤推定値の誤差分差は、受験者数を増大させた場合、フィッシャー情報量の逆数に近づくという性質がある(=漸近有効性)
    → 母数の推定値の誤差分散から推定の精度を評価できる
  • 項目ごとの情報量を「項目情報関数 (Item Information Function: IIF)という
  • テキスト版全体について和をとる → \(\theta\) の値ごとにプロットしたもの
    → 「テスト情報関数」(Test Information Function: TIF)
  • TIFはテスト版がどの程度の能力 \(\theta\) をもつ受験者向けなのかを検討するための材料になる
  • 潜在特性値の誤差分散を使う → 受験者ごとの潜在特性値の95%信頼区間を示せる
    → IIFTIF は、コンピュータ適応型テスト (Computer Adaptive Test: CAT) を実施する上で重要な役割を演じる

2.3.2 等化

  • IRTによる尺度化によって得られた項目母数
    → 受験者集団の平均的能力が違えば、得られる数値が異なる
  • 平均的能力が異なる集団Aと集団Bを考える
集団 平均的能力
集団 A 1
集団 B 2
  • 同一の項目を集団Aと集団Bに提示した場合の、集団Aと集団Bから求められた困難度
  • 集団Aから求められた困難度の方が、集団Bから求められた困難度 (= a) より 1 だけ大きな値になる
集団 困難度
集団 A a + 1
集団 B a
その理由:
  • 同一の項目でも、より平均能力が低い集団Aからみると、集団Bからみた時と比べると、より困難度が高めに推定されるため

  • もしより平均能力が低い集団Aを「規準」と設定すれば
    → 集団Bから得られた項目母数を集団Aの尺度上に乗せれば
    → 集団Bから得られた項目母数を線形変換すればよい

  • 複数の集団から得られた項目特性や潜在特性値を比較するためには

  • 複数の尺度をまたいで定義される共通の尺度を定める
    → 共通尺度に他の尺度を会わせる操作を行う
    → この操作を「等化」と呼ぶ

等化とは

あるテストにおいて同一の設計のもとで作成された異なる版のテスト得点を、共通尺度上の得点に変換する統計的な手続き

  • このような線形変換操作が許されるのは、ICCが変換に対して不偏だから
  • IRTを使って尺度化を行い
    → 事前に規準集団を定義しておく(例えば、より平均能力が低い集団A)
    → ここから得れた項目母数(例えば困難度 \(a\))を「規準集団上の尺度」として固定
  • 別の集団(例えば、より平均能力が高い集団B) から得られた項目母数を規準集団上の尺度の変換する
  • この時に必要となるデータは、同一項目において別集団から得られた項目母数の値
変数名 詳細
\(a^*_{jB}\) テスト版Aの尺度上で表現されたテスト版Bの項目母数の変換後の値(=等化後の識別力)
\(b^*_{jB}\) テスト版Aの尺度上で表現されたテスト版Bの項目母数の変換後の値(=等化後の困難度)
\(a_{jB}\) テスト版Bの集団から得られた項目母数(=等化前の識別力)
\(b_{jB}\) テスト版Bの集団から得られた項目母数(=等化前の困難度)

\[a^*_{jB} = a_{jB} / K\] \[b^*_{jB} = Kb_{jB} + L\]

L と K : 等価係数

  • L と K の等価係数を共通項目の項目母数から推定する
    → 2 つのテスト版で共通の尺度上で表された項目母数を得る

2.3.3 等化の手順

  • 等化による共通尺度化を行う上で重要なこと
  1. 規準集団の定め方
  2. テスト実施前の計画(共通項目を含む複数のテスト版の提示法に関する)
  • 共通項目を使った等化を行うためには、規準集団上での項目母数を推定しておく必要あり
  • 項目群から得られる尺度の信頼性・妥当性を検証する目的で実施するテスト=フィールドテスト
  • フィールドテストを実施 → 規準集団上での項目母数を推定
    → それを項目の文言等の情報と一緒に「項目バンク」に登録する
  • 学力を判断したい受験者に対して「本試験」を実施する
  • 「本試験」で使うテスト版では項目母数を推定した項目を共通項目として使う
  • 共通尺度化では、本試験の受験者から得られた項目母数・・・\((a_{jB}, b_{jB})\)
  • 規準集団から得られた項目母数に近い \((a^*_{jB}, b^*_{jB})\) を与えるような K と L を推定する

\[a^*_{jB} = a_{jB} / K\] \[b^*_{jB} = Kb_{jB} + L\]

  • IRTを使った等化を行う2つの方法
方法 詳細
共通項目デザイン 共通項目における項目母数を手がかりにする方法
共通受験者デザイン 共通受験者による方法
  • 受験者に対する心理的負荷を考慮すると、共通項目デザインが現実的

3. パッケージを用いたIRT分析

データの準備

  • ltmパッケージの中に入っているデータを使う
    The Law School Admission Testへの解答結果を採点

  • 受験者数: 1000人

  • 項目数:Section IVに含まれる5項目

  • 正答なら1、誤答なら0

変数名 詳細
ID 受験者のID
Item1 1番目の項目への解答結果 (0 or 1)
Item2 2番目の項目への解答結果 (0 or 1)
Item3 3番目の項目への解答結果 (0 or 1)
Item4 4番目の項目への解答結果 (0 or 1)
Item5 5番目の項目への解答結果 (0 or 1)
SS Item1-5の合計点
class 素点に基づく受験者のクラス分け

•class: 1〜5で表され、値が高くなるほど素点の高いクラス
⇒ このデータをIRTに基づき分析し、項目やテストの特性を評価する - 分析で使うパッケージを読み込む

library(ltm)
  • データを読み込む
data(LSAT)
  • データフレーム LSAT が含む変数名を確認する
names(LSAT)
[1] "Item 1" "Item 2" "Item 3" "Item 4" "Item 5"
  • Item 1item1 に変更する(変数名から半角スペースを削除)
LSAT <- LSAT |> 
  rename("item1" = "Item 1",
    "item2" = "Item 2",
    "item3" = "Item 3",
    "item4" = "Item 4",
    "item5" = "Item 5")
  • item1 から item5 までの合計点を表す変数 total を作る
LSAT <- LSAT |> 
  dplyr::mutate(total = rowSums(dplyr::across(item1:item5), 
    na.rm = TRUE)) # 欠損値(NA)があっても無視して合計するよう指定
DT::datatable(LSAT)
  • ここでは次の手順で分析を進める
  • 主として irtoysパッケージを使う
使う関数 内容
1. 正答率の計算 colMeans() データの適合性を検討
2. I-T相関の計算 cor() データの適合性を検討
3. 1 次元性の計算 fa.parellel() データの適合性を検討(psychパッケージ
4. 項目母数の推定 est() 「困難度」「識別力」の推定
5. 潜在特性値の推定 mlebme() 能力\(\theta\)の推定
6. 局所独立性の検討 irf() & cor() 推定値の妥当性を検討
7. 項目適合度の検討 itf() 推定値の妥当性を検討
8. 項目特性曲線 (ICC) の作成 irf() & plot() 結果の解釈
9. テスト特性曲線 (TCC) の作成 trf() & plot() 結果の解釈
10. テスト情報曲線 (TIC) の作成 tif() & plot() 結果の解釈

3.1 正答率の計算: colMeans()

  • 正答率の計算
  • colMeans()関数を使って正答率 (Correct Response Rate: crr)を計算
crr <- colMeans(x = LSAT[, 1:5],
  na.rm = TRUE)
crr
item1 item2 item3 item4 item5 
0.924 0.709 0.553 0.763 0.870 
  • ここで得られた結果 crr は「名前付きの数値ベクトル」: named numeric vector
    → 使い勝手が悪いので、このベクトルをデータフレームに変換する
df_crr <- data.frame(      # データフレーム名を指定(ここでは df_crr と指定)
  item = names(crr),       # 変数名を指定(ここでは item と指定)
  seikai = as.numeric(crr) # 変数名を指定(ここでは seikai と指定)
)
  • データフレームを確認
df_crr
   item seikai
1 item1  0.924
2 item2  0.709
3 item3  0.553
4 item4  0.763
5 item5  0.870
  • 正答率が低い順位並べ変えて表示させてみる
  • seikai の大きい順に因子の順序を指定
df_crr$item <- factor(df_crr$item, 
  levels = df_crr$item[order(df_crr$seikai)])
ggplot(df_crr, aes(x = seikai, y = item)) +
  geom_bar(stat = "identity", fill = "skyblue") +
  geom_text(aes(label = round(seikai, 2)),  # 小数第2位で丸める
            hjust = 1.2, size = 6) +        # 棒の内側に表示
  labs(
    title = "各項目の正答率",
    x = "項目",
    y = "正答率"
  ) +
  theme_minimal() +
  theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策  

  • item1の正答率が最も高く (92%)、item3が最も正答率が低い(55%)ことがよくわかる

正答率の計算のポイント ・極端に正答率の高い/低い項目があるかどうか
- 極端に高い/低い項目がある場合 → 問題あり
- 極端に高い/低い項目がない場合 → 問題なし

→ ここでは極端に高い/低い項目がない → 問題なし
→ 次の分析に移る

3.2 I-T相関の計算: cor()

  • cor()関数を使って、素点 (item1item5) と合計点 total との相関を計算
it <- cor(x = LSAT[, 1:5],
  y = LSAT[, 6],
  use = "pairwise.complete.obs")
it
           [,1]
item1 0.3620104
item2 0.5667721
item3 0.6184398
item4 0.5344183
item5 0.4353664
  • ここで得られた結果 it は「「行名付きの1列行列(matrix)」

→ 使い勝手が悪いので、この matrix をデータフレームに変換して、行名を項目名の列として追加する

# 行列をデータフレームに変換
df_it <- as.data.frame(it)

# 行名を項目名として列に追加
df_it$item <- rownames(df_it)

# 列名をわかりやすく変更(オプション)
colnames(df_it) <- c("correlation", "item")
DT::datatable(df_it)
  • 相関係数が低い順位並べ変えて表示させてみる
  • correlation の値順に因子の順序を指定
df_it$item <- factor(df_it$item, 
  levels = df_it$item[order(df_it$correlation)])
ggplot(df_it, aes(x = item, y = correlation)) +
  geom_bar(stat = "identity", fill = "orange") +
  geom_text(aes(label = round(correlation, 3)), 
    vjust = -0.5, size = 4) +
  ylim(0, 0.7) +
  labs(
    title = "項目-合計相関(item-total correlation)",
    x = "項目",
    y = "相関係数"
  ) +
  theme_minimal() +
  theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策  

  • 素点 (item1item5) と各項目得点 (total) との相関は 0.36〜0.61の間

I-T相関の計算のポイント ・各項目への反応 (item1〜item5) と合計点 (ss) との間にI-T 相関が認められるかどうか

IT相関の値 評価 項目の扱い
〜 0.2 極めて低い(要注意) 除外を検討する
0.2〜0.3 やや低い 内容によって再検討
0.3〜0.4 妥当なレベル 保留・文脈による判断
0.4以上 良好(望ましい) 採用して問題なし

→ ここでは全て 0.2 以上の相関が認められる → 問題なし
→ 項目を除外せず、次の分析に移る

3.3 一次元性の検討: fa.parellel()

  • 因子分析で利用される方法を用いて検討することが多い
  1. スクリープロット
  2. 平行分析(Horn, 1965)
    ⇒ Rでの実行方法については質問紙データの解析例にて解説

一次元性の検討 ・各項目反応の背後に 1 つの潜在特性を仮定できるかどうか
- 1 つの潜在特性を仮定できない場合 → 問題あり
- 1 つの潜在特性を仮定できる場合 → 問題なし

→ ここでは・・・・・ → 問題なし
→ 次の分析に移る

3つのデータの適合性(正答率、I-T相関、1次元性)をクリア

→ 項目母数と潜在特性値の推定へ

3.4 項目母数の推定

・ここでは3つの項目反応モデルを扱う  

  • 1 パラメタ・ロジスティックモデル (1PL: Raschモデル)
  • 2 パラメタ・ロジスティックモデル (2PL: 一般化ロジスティックモデル)
  • 3 パラメタ・ロジスティックモデル (3PL: 一般化ロジスティックモデル)

• 項目母数の推定
• 潜在特性値は平均が0、分散が1の正規分布(標準正規分布)に従うと仮定して推定を行うのが一般的

1PLモデルと2PLモデルの違い

特徴 1PLモデル(Raschモデル) 2PLモデル(一般化ロジスティックモデル)
モデル式 \(P(正答)= \frac{1}{1+e^-(\theta-b)}\) \(P(正答)= \frac{1}{1+e^{-a}(\theta-b)}\)
識別力 a すべての項目で同じ(固定) 項目ごとに推定
困難度 b 項目ごとに推定 項目ごとに推定
パラメータ数 項目数(b のみ)+1(a 固定) 項目数 × 2(a と b をそれぞれ推定)
分析対象 能力と困難度bの関係 能力、困難度 b、識別力の関係(より柔軟なモデル)
  • 1PLモデル(Raschモデル)では「すべての項目が等しい識別力を持つ」という強い仮定がある
  • 2PLモデルはその仮定を緩め、実際の項目の識別力の違いを反映する   

→ 1PLモデルでは「困難度(bパラメータ)」だけが推定される
→ 2PLモデルでは「困難度(bパラメータ)」と「識別力(aパラメータ)」が推定される
→ 2PLモデルでは、項目ごとの「能力の区別のしやすさ」が明らかになる

1パラメタ・ロジスティックモデル (1PL)

  • 1PLMを仮定したときの項目母数を周辺最尤推定する
    est関数(項目母数を推定する)を利用して項目母数を推定
    est関数はirtoysパッケージの中に入っている関数
est(resp = LSAT[, 1:5], # テストデータを指定する引数
  model = "1PL",        # 1PLMを仮定
  engine = "ltm") # ltmパッケージを利用して項目母数を推定すると指定
$est
           [,1]       [,2] [,3]
item1 0.7551356 -3.6152634    0
item2 0.7551356 -1.3224198    0
item3 0.7551356 -0.3176309    0
item4 0.7551356 -1.7300890    0
item5 0.7551356 -2.7801702    0

$se
     [,1]       [,2] [,3]
[1,]    0 0.32664059    0
[2,]    0 0.14218199    0
[3,]    0 0.09767702    0
[4,]    0 0.16913567    0
[5,]    0 0.25104778    0
[6,]    0 0.06943327    0

$vcm
$vcm$Dffclt.item1
[1] 0.1066941

$vcm$Dffclt.item2
[1] 0.02021572

$vcm$Dffclt.item3
[1] 0.009540801

$vcm$Dffclt.item4
[1] 0.02860687

$vcm$Dffclt.item5
[1] 0.06302499

$vcm$Dscrmn
[1] 0.004820979

結果の解釈

推定値からわかること

    1. item1が最も簡単な問題(← 困難度 b の値のマイナスが最も大きい)
    1. item3が最も難しい問題(← 困難度 b の値のマイナスが最も小さい)
    1. item3の推定精度が最も高い(← 困難度 b の標準誤差が最小)
  • 標準誤差 SE が小さい = 推定値の信頼性が高い

注意:

• 識別力 a の値が項目間で同一
・理論的には 1PLでは識別力 a は固定されて推定されない
・しかし、ltmパッケージでは識別力 a も推定され同一の数値 (0.7551356) に固定
$vcm は分散共分散行列で「分散(標準誤差の2乗)」として出力
→ 項目パラメータの不確実性を捉えるのに有益

1PLM分析結果のまとめ
・中程度の識別力(a ≈ 0.76)で設計された、難易度に差のあるテストである
・困難度の範囲は −3.6 〜 −0.3
→ 低〜中能力者に適したテスト
・推定値の精度は全体的に良好(標準誤差 SE が小さい)
・項目ごとの識別力の違いに注目したければ 2PLモデルが有効

2 パラメタ・ロジスティックモデル (2PL)

  • 2PLモデルは、1PLのRaschモデルより柔軟
    → パラメータ数が増える分だけ推定の安定性はやや下がる
  • 2PLモデルの数式:

\[P(正答) = \frac{1}{1 + exp[-a(\theta - b)]}\] a: 識別力(discrimination) → 項目ごとに異なる
b: 困難度(difficulty)
θ: 潜在能力(受験者のスキル)

  • 1PLモデルとの違いは、aパラメータが項目ごとに推定されること
est(resp = LSAT[, 1:5], # テストデータを指定する引数
  model = "2PL",        # 2PLMを仮定
  engine = "ltm") # ltmパッケージを利用して項目母数を推定すると指定
$est
           [,1]       [,2] [,3]
item1 0.8253717 -3.3597333    0
item2 0.7229498 -1.3696501    0
item3 0.8904752 -0.2798981    0
item4 0.6885500 -1.8659193    0
item5 0.6574511 -3.1235746    0

$se
          [,1]       [,2] [,3]
[1,] 0.2580641 0.86694584    0
[2,] 0.1867055 0.30733661    0
[3,] 0.2326171 0.09966721    0
[4,] 0.1851659 0.43412010    0
[5,] 0.2100050 0.86998187    0

$vcm
$vcm[[1]]
           [,1]      [,2]
[1,] 0.06659708 0.2202370
[2,] 0.22023698 0.7515951

$vcm[[2]]
           [,1]       [,2]
[1,] 0.03485894 0.05385658
[2,] 0.05385658 0.09445579

$vcm[[3]]
           [,1]        [,2]
[1,] 0.05411071 0.012637572
[2,] 0.01263757 0.009933553

$vcm[[4]]
           [,1]       [,2]
[1,] 0.03428641 0.07741096
[2,] 0.07741096 0.18846026

$vcm[[5]]
           [,1]      [,2]
[1,] 0.04410211 0.1799518
[2,] 0.17995180 0.7568684
para.2PL <- est(resp = LSAT[,1:5],
  model="2PL",
  engine="ltm")

識別力(aパラメータ)に基づく基準

aの値 解釈 判断
〜0.50 非常に低い識別力 除外対象
0.50〜0.80 やや低い 保留または再検討
0.80〜1.50 妥当な識別力 採用可
1.50〜 高い識別力(理想的) 積極的に採用

・目安:a ≥ 0.80 を合格ラインとすることが多い
・ただし、テストの目的や項目数によって柔軟に運用されます

困難度(bパラメータ)に基づく基準

bの値 解釈 判断
〜-3 極端に簡単すぎる 除外対象
-2〜2 妥当な難易度範囲 採用してOK
3〜 極端に難しすぎる 除外対象

・bの理想範囲は、θがカバーする範囲(通常 -3〜+3) に収まること
・極端なb値(±3以上)は、能力に関係なく正答率が0または1に近くなりやすく、情報が少ない

結果の解釈

識別力 a の解釈:

・項目が能力をどれだけ区別できるかを示すパラメータ
・一般的に:

a < 0.5: 識別力が低い(望ましくない)
a ≈ 1: 中程度の識別力(良好)
a > 1.5: 高い識別力(非常に良い)

→ このテストの項目はすべて a ≈ 0.65〜0.89 → 中程度の識別力

推定値からわかること

    1. item1が最も簡単な問題(← 困難度 b の値のマイナスが最も大きい: -3.3597333)
    1. item3が最も難しい問題(← 困難度 b の値のマイナスが最も小さい: -0.2798981)
    1. item3の推定精度が最も高い(← 困難度 b の標準誤差が最小: 0.09966721)

2PL分析結果のまとめ
・全体的に簡単な項目に偏っている
・item3 は 適度な難易度・高い識別力で、IRT的には非常に良い項目
・item1とitem5 は簡単すぎて識別力も低め
 → テストの目的によっては、除外や見直しすべき

改善のヒント:

・困難度という観点から、困難度が −3 以下の item1item5 は削除対象
・代わりに難しい項目を追加するとバランスがよくなる
・識別力の高い(a > 1.2)項目を加えると、能力の区別精度が上がる
・b ≈ 0〜+2 の項目を加えると、高能力者の識別力も補強できる

3 パラメタ・ロジスティックモデル (3PL)

est(resp = LSAT[, 1:5], # テストデータを指定する引数
  model = "3PL",        # 3PLMを仮定
  engine = "ltm") # ltmパッケージを利用して項目母数を推定すると指定
$est
          Dscrmn     Dffclt     Gussng
item1  0.2945829 -8.2376044 0.09306093
item2 12.0612683  0.9892132 0.64301268
item3 14.6898035  1.0033451 0.45379015
item4 20.8485498 -0.5737457 0.01076137
item5  0.4268108 -3.9246143 0.21505474

$se
     [,1] [,2] [,3]
[1,]  NaN  NaN  NaN
[2,]  NaN  NaN  NaN
[3,]  NaN  NaN  NaN
[4,]  NaN  NaN  NaN
[5,]  NaN  NaN  NaN

$vcm
$vcm[[1]]
     [,1] [,2] [,3]
[1,]  NaN  NaN  NaN
[2,]  NaN  NaN  NaN
[3,]  NaN  NaN  NaN

$vcm[[2]]
     [,1] [,2] [,3]
[1,]  NaN  NaN  NaN
[2,]  NaN  NaN  NaN
[3,]  NaN  NaN  NaN

$vcm[[3]]
     [,1] [,2] [,3]
[1,]  NaN  NaN  NaN
[2,]  NaN  NaN  NaN
[3,]  NaN  NaN  NaN

$vcm[[4]]
     [,1] [,2] [,3]
[1,]  NaN  NaN  NaN
[2,]  NaN  NaN  NaN
[3,]  NaN  NaN  NaN

$vcm[[5]]
     [,1] [,2] [,3]
[1,]  NaN  NaN  NaN
[2,]  NaN  NaN  NaN
[3,]  NaN  NaN  NaN
para.3PL <- est(resp = LSAT[,1:5],
  model="3PL",
  engine="ltm")

推定値からわかること

  • $se などに適当な数値が入っていない NaN
    ⇒ 推定が上手くいっていない

3.5 潜在特性値の推定: mlebme()

  • Rで潜在特性値を推定する
    mlebme関数を利用して潜在特性値を推定
    mlebme関数はirtoysパッケージの中に入っている関数
head(mlebme(resp = LSAT[, 1:5], # テストデータを指定
  ip = para.2PL$est,       # データに対し2PLMを仮定
  method = "BM"))           # 最尤推定法 (ML) による潜在特性値の推定を指定
           est       sem n
[1,] -1.895392 0.7954829 5
[2,] -1.895392 0.7954829 5
[3,] -1.895392 0.7954829 5
[4,] -1.479314 0.7960948 5
[5,] -1.479314 0.7960948 5
[6,] -1.479314 0.7960948 5
  • resp: テストデータを指定する引数
  • ip: テストに含まれる各項目の項目母数を指定する引数
  • para.2PL$est と指定
    → データに対し2PLMを仮定したときの項目母数の推定値が各項目の項目母数として指定
  • 項目母数を推定した後に、潜在特性値の推定を行う
  • method: どの推定法を用いて潜在特性値を推定するか
  • ML と指定
    → 最尤推定法による潜在特性値の推定を指定
    ⇒ 全問正答/誤答の受験者がいる場合、コれらの受験者の推定値が求まらない
  • BM と指定
    → 潜在特性値が標準正規分布に従っていることを仮定しているという情報を加味して推定が行えるようになり(事前情報)
    → 全問正答/誤答の受験者に対しても推定値を得ることができる(ベイズ推定)
theta.est <- mlebme(resp = LSAT[,1:5],
  ip = para.2PL$est,
  method="BM")
DT::datatable(theta.est)
  • 1列目:推定値 (est)
  • 2列目:標準誤差 (sem)
  • 3列目:解答した項目 (n)

3.6 局所独立性の検討: irf() & cor()

  • IRTに基づきテストデータや質問紙への回答を分析する
    ⇒ 局所独立性が仮定されている
    • IRTにおける局所独立性の検討
  • 潜在特性値 \(\theta\) の値を固定したとき、項目相互間で解答が独立に生じている仮定を満たすこと
  • 「局所独立の仮定」とは「一次元性の仮定」のこと

一次元性の仮定 各項目の正誤が、潜在特性値 \(\theta\) の値の大小によってのみばらつく

  • つまり「受験者が正解するかどうかは、受験者の能力だけで決まる」という仮定

• 局所独立性の検討は \(Q_3\)統計量に基づいて行われることが多い
\(Q_3\)統計量とは、各項目への回答(観測値)からその期待値を引き
→ 得られた残差得点間の相関を求めることで得られる
- \(Q_3\)統計量は、各項目への反応(= 観測値) からその期待値(= 項目反応モデルにより計算される正答確率)を引き
→ 得られた残差得点間の相関を求めることで得られる統計量
- その絶対値が 0 に近いほど、項目反応間に局所独立性を仮定できる

• たとえば今の場合、item1 の残差得点\(d_1\)は次の式で表せる

\[d_1 = u_1 - \hat{P_1(\theta)}\]

  • \(u_1\): item1 への解答結果(正答なら1、誤答なら0)
  • \(\hat{P_1(\theta)}\): 項目母数と潜在特性の推定値から計算される正答確率

Rで \(Q_3\) 統計量を計算する方法

1. irf関数を利用して正答確率 ($f) を推定

irf関数では2PLMを仮定
para.2PL$est と指定
→ データに対し2PLMを仮定したときの項目母数の推定値を各項目の項目母数として指定
theta.est[, 1] と指定
→ データに対し2PLMを仮定したときの潜在特性の推定値を指定

⇒ 結果はPとして保存

P <- irf(ip = para.2PL$est, # 項目母数を指定
  x = theta.est[, 1])  # 各受験者の潜在特性値を指定
変数 内容
$x 各受験者の潜在特性値\(\theta\)(能力)
$f 正答確率の推定値
受験者 (1,000名)
項目 (item1〜item5)

2. 推定された正答確率とテストデータより、残差得点 \(d\) を算出
  • \(d_j = u_j - \hat{P_j(\theta)}\) の値を計算して \(d\) として保存 (1 ≦ j ≦5 )
  • P$fと指定することで,正答確率の推定値が抽出される
    ⇒ テストデータ (LSAT,1:5]) から正答確率を引いた残差得点を \(d\) に保存
d <- LSAT[, 1:5] - P$f # P$f と指定して正答確率の推定値を得る  
  • 1,000人の受験生の最初の6人分の計算結果を表示させてみる
head(d)
       item1      item2      item3      item4      item5
1 -0.7700558 -0.4061064 -0.1917689 -0.4949268 -0.6915701
2 -0.7700558 -0.4061064 -0.1917689 -0.4949268 -0.6915701
3 -0.7700558 -0.4061064 -0.1917689 -0.4949268 -0.6915701
4 -0.8252089 -0.4801900 -0.2557741 -0.5661590  0.2533129
5 -0.8252089 -0.4801900 -0.2557741 -0.5661590  0.2533129
6 -0.8252089 -0.4801900 -0.2557741 -0.5661590  0.2533129

受験者1のitem1 に関する残差得点 \(d_{11}\)をチェック ・例えば、受験者1のitem1 に関する残差得点 \(d_1\) は -0.7700558
・受験者1の item1 への回答 \(u_{ij} = u_{11}\) を確認してみる

LSAT[1,1]
[1] 0
  • 受験者1の item1 への回答は 0(誤り)
  • 受験者1の item1 に関する正答確率の推定値 \(\hat{P_{11}(\theta)}\) は0.7700558(上の図を参照)
    → 受験者1の残差得点 \(d_{11}\)
LSAT[1,1] - 0.7700558
[1] -0.7700558
3. cor関数を利用して \(Q_3\) 統計量の値を計算
Q3 <- cor(x = d, 
  y = d, 
  use = "pairwise.complete.obs")
Q3
            item1       item2       item3        item4        item5
item1  1.00000000 -0.04142824 -0.04101429 -0.064167975 -0.062538809
item2 -0.04142824  1.00000000 -0.11322248 -0.097060194 -0.029585197
item3 -0.04101429 -0.11322248  1.00000000 -0.092262203 -0.104216701
item4 -0.06416797 -0.09706019 -0.09226220  1.000000000 -0.003656669
item5 -0.06253881 -0.02958520 -0.10421670 -0.003656669  1.000000000

局所独立性の検討のポイント 各項目の正誤が、潜在特性値 \(\theta\) の値の大小によってのみばらつくかどうか
\(Q_3\) の絶対値が 0 に近いほど、項目反応間に局所独立性を仮定できる
\(Q_3\) の値の絶対値が 0.2以上の場合 → 問題あり: 局所依存性の疑い(Chen & Thissen, 1997)
\(Q_3\) の値の絶対値が 0.2以下の場合 → 問題なし

→ ここでは\(Q_3\) の値の絶対値が全て 0.2以下 → 問題なし
→ 局所独立性が成立していることを示唆
→ 次の分析に移る

・局所依存性:局所独立性が満たされていない状態のこと
\(Q_3\)はあくまで一つの基準に過ぎないので注意が必要

3.7 項目適合度の検討: itf()

・「各項目が理論モデル(例:2PLモデル、3PLモデル)にちゃんと従っているかどうか」を評価するものが項目適合度 (Item Fit)
• IRTにおいては項目反応モデルへの適合度を検討することも重要

• ここでは、itf関数を利用して item1 の項目適合度を検討してみる

  • resp はテストデータを指定する引数
irtoys::itf(resp = LSAT[, 1:5], # 応答データ [受験者, 項目]  
  item = 1,                     # 1番目の項目適合度の検討を指定する
  ip = para.2PL$est,        # 2PLモデルによる推定された項目パラメータ
  theta = theta.est[, 1])       # 受験者ごとの能力推定値(θ)

 Statistic         DF    P-value 
10.0741811  6.0000000  0.1215627 
  • 図は、当てはめた項目反応モデルとデータとの乖離度を示している
  • 横軸・・・潜在特性値 (Ability)   
  • 縦軸・・・正答確率 (Proportion right)
  • 実線・・・当てはめた項目反応モデルに基づく正答確率の予測値
  • 円・・・潜在特性の推定値に基づき受験者を群分けした際の群ごとの実際の正答率
    • 潜在特性値\(θ\)(能力)は平均0、分散1

項目適合度でわかること
その項目がIRTモデルに「合っているか」どうか
・各項目の「実際のデータによる反応パターン」と、IRTモデルが「理論的に予測する反応パターン」を比較
→ もしズレていたら、モデルの仮定がその項目には合っていないということ

なぜ重要?

・モデルに合っていない項目を使うと、潜在特性値\(θ\)(能力)の推定が不正確になる可能性あり
・項目の品質をチェックし、不適切な項目を修正・削除する判断材料になる
・バイアスの検出(DIF:Differential Item Functioning)の手がかりにもなる

適合度が悪いときに考えられること
現象 可能性
実際の正答率がモデルより低い 問題文がわかりにくい/迷いやすい選択肢
特定の能力層だけ挙動がおかしい バイアスがある、ミスリードされやすい項目
正答率がランダムに近い 推測が強く影響(cパラメータが不十分)
認知的に複雑すぎる 単一の「能力θ」では説明できない

適合度を判断する指標: S-X²統計量(Orlando & Thissenの項目適合度指標)
・より精度の高い適合度検定(特に2PLや3PLに使う)
・能力をグループ(通常は10分位など)に分け
→ 各グループでのモデルによる期待正答率と、実際の正答率の差を使う
→ カイ二乗型の統計量として適合度を評価
= これは、カイ二乗分布に従う統計量だが、S-X²特有の方法
→ 通常のカイ二乗適合度検定とは区別される

結果の解釈

\[ 帰無仮説: 「当てはめたモデルがデータに適合している」\]

得られた結果:
  • p値が有意水準 (0.05) よりも大きい: p-value = 0.1215627
    → 帰無仮説は棄却できない
    「当てはめた項目反応モデルがデータに適合している」と判断される

  • itf 関数を使用した際に出力される図において

  • 実線と円の間の乖離が大きいほど、モデルがデータに当てはまっていないと判断

3.8 項目特性曲線 (ICC) の作成

• 項目特性曲線(Item Characteristic Curve,ICC
・ある項目(= 問題)に対して、受験者の能力 \(\theta\) に応じた正答確率を表す曲線
・潜在特性値 \(\theta\) の値毎に正答確率を計算し、プロットしたもの

・横軸・・・潜在特性値\(θ\)(能力)
・縦軸・・・正答確率(0 〜 1)

  • ip: テストに含まれる各項目の項目母数を指定する引数
  • para.2PL$est と指定
    → 2PLMを仮定したときの項目母数の推定値を、各項目の項目母数として指定
    ⇒ 様々な潜在特性値 \(θ\) における正答確率を P に収納
P <- irf(ip = para.2PL$est) # irf()関数を使って正答確率を計算  
plot(x = P,     # xは引数、irf関数で推定した結果を指定する
  co = NA,      # ICCの色を指定/項目毎に異なる色でICCを描く
  label = TRUE) # 各ICCに項目の番号がつく

abline(v = 0, lty = 2) # x = 0 の縦点線を引く

横軸・・・潜在特性値 \(θ\) (Ability)
縦軸・・・正答確率 (Probability of a correct response)

2 パラメタ・ロジスティックモデル (2PLM)

\[P_j(\theta|a_j, b_j) = \frac{1}{1 + exp(-Da_j(\theta - b_j))}\]

項目特性曲線 (ICC) でわかること(簡易版) item3 の曲線は中央にあり、識別力(a)も高め → 優れた項目
● item1・item5は曲線が左に寄っていて、問題が簡単すぎる項目
曲線が急なものほど、能力の違いをよく識別できる(item3が典型)
・item3 は θ ≒ -0.3 あたりで急激に上昇
→ 能力値が上がるにつれて正答確率が鋭く上がる
→ 識別力が高い
→ このような項目は、平均的な受験者を的確に弁別する良い項目

項目特性曲線 (ICC) でわかること(詳細版) 1. 項目の難易度(bパラメータ)

・カーブが θ (Ability) = b の点で50%の正答率  
・この「50%の正答率になるθ」が、その項目の難易度
・最も正解率が低くて易しい問題 => item3
・最も正解率が高くて難しい問題 => item1

2. 識別力(aパラメータ)
・カーブの傾きの急さが識別力
・急勾配 → わずかな能力の差で正答確率が大きく変わる(=識別力が高い)=> item3
・なだらか → 誰にとっても似たような正答確率(識別力が低い)      =>item1
4. 項目の機能(差別性や妥当性)
・ICCの形から「この項目が誰にとって意味のある問題か」がわかる
・能力の低い人〜高い人まで同じ正答率 → 区別がつかない問題
・特定のθ (Ability)で大きく変化 → そのあたりの能力の見極めに有効

TICの山の位置 意味 対象
θ = 0 周辺 平均均的な受験者向け 一般的な学力テスト
θ > 0(右寄り) 高能力者向け 難関資格・上級試験
θ < 0(左寄り) 初級者・低能力者向け 基礎力診断など

5. ICCの形の解釈

ICCの形 解釈
急で真ん中で立ち上がる 難易度ちょうどよく、識別力が高い良問
なだらかに上がる 識別力が低い、あまり差がつかない
右側で上がる 難しい問題(上位者向け)
左側で上がる 易しい問題(初心者向け)
*底上げされて始まる 推測による正答の影響あり(cパラメータが高い)

・通常のICCなら、能力がないとほぼ絶対に解けないはず
*「底上げされて始まる」というのは「能力が低くても当たる可能性がある」こと
・例:選択肢を勘で当てる(= 推測による正答)、ヒントがある、構造上バイアスがあるなど

3.9 テスト特性曲線(TCC)の作成: trf() & plot()

• 潜在特性値の値毎に素点の期待値を計算しプロットする
- trf関数を使ってテスト情報量を計算
→ plot関数で TCC を作成

E <- trf(ip = para.2PL$est)  # データに対し2PLMを仮定
                             # ip: テストに含まれる各項目の項目母数を指定する引数
plot(x = E)                  # 様々な潜在特性値における素点の期待値(Expectation)

横軸・・・潜在特性値 (Ability)
縦軸・・・正答確率 (Proportion right)

テスト特性曲線 (TCC) でわかること 1. 受験者の能力 \(\theta\) と期待得点の関係

・実線が右肩上がり
→ 受験者の能力が上がるにつれて、得点も上がる傾向あり

2. テストの難易度と分布の様子
・受験者の能力 \(\theta\)0 のあたりで急に得点が上がっている場合
→ 平均的な能力の人向けのテスト
・受験者の能力 \(\theta\)2 〜 4 のあたりで急に得点が上がっている場合
→ 平均以上の能力の人向けのテスト
・受験者の能力 \(\theta\)−4 〜 −2 のあたりで急に得点が上がっている場合
→ 平均以下の能力の人向けのテスト

3. 得点分布の歪みや限界
・TCCの傾きが緩やかな部分
→ その能力帯では得点の変化が鈍い(= 差がつきにくい)
・正答確率の上限や下限に近い部分が平坦になっている場合は
→ 高得点者と低得点者の差がつきにくい

3.10 テスト情報曲線 (TIC) の作成

• テスト情報曲線 (Test Information Curve,TIC)
- 「テストがどの能力レベル(θ)でどれくらい正確に測れているか」を可視化できる  • 潜在特性値の値毎にテスト情報量を計算しプロットする
- tif関数を使ってテスト情報量を計算
→ plot関数で TIC を作成

  • 様々な潜在特性値\(θ\)(能力)におけるテスト情報量(Information)が I
I <- irtoys::tif(ip = para.2PL$est) # データに対し2PLMを仮定
                           # x: tif関数で推定した結果を指定する引数
plot(x = I)                # ip: テストに含まれる各項目の項目母数を指定する引数 

・横軸・・・潜在特性値\(θ\)(能力)
・縦軸・・・テスト情報量
・実線・・・テスト情報曲線
→ 当該潜在特性値におけるテスト情報量をつなぎ合わせたもの

テスト情報曲線 (TIC) でわかること 1. どの能力レベルを正確に測れているか?
・情報量が高いところ → そのθレベルでテストが高精度
=> \(\theta = −2\)付近の情報量が最も高い → \(\theta = −2\)のレベルでテストが高精度

・情報量が低いところ → そのθレベルではテストの精度が低い   => \(\theta = −4\)付近の情報量が最も低い → \(\theta =  4\)のレベルでテストが低精度

例:TICがθ=0の周辺で高ければ、「平均的な人を測るのに最適なテスト」だといえる

2. テストの設計意図が見える
・TICがどこで山になるかを見ることで、そのテストがどんな対象向けかが分かる
・TICが\(\theta = −2\)付近で山になっている
→ このテストは比較的能力の低い人向け

・TICがどこで山になるかを見ることで
=> そのテストがどんな対象向けかが分かる

TICの山の位置 意味 対象
θ = 0 周辺 平均均的な受験者向け 一般的な学力テスト
θ > 0(右寄り) 高能力者向け 難関資格・上級試験
θ < 0(左寄り) 初級者・低能力者向け 基礎力診断など

・ここではTICの山の位置が左より → 平均均的な受験者向けだとわかる

3. 信頼性の高さ(精度)もわかる
・情報量が高い=その範囲の 標準誤差(SE)が小さい
・標準誤差との関係:

\[SE(\theta) = \frac{1}{\sqrt{{I(\theta)}}}\]

・つまり、情報量が大きいと \(\theta\) の推定がブレにくい(= 信頼できる)

項目適合度の結果のポイント どの潜在特性値 \(\theta\) の値で、情報量が最大になるか
・潜在特性値が −2 の辺りでテスト情報量が最大
⇒ 潜在特性値\(θ\)(能力)が低い( −2 の辺り )受験者の推定精度が最も高くなる

4. 実際のテストスコアを使ったIRT分析

irt_exercise_4.1.csvは、11問の正誤問題(1が正答、0が誤答)を65人の受験が受験した試験結果である。 このデータには次の3つの変数が含まれている。

変数名 詳細
ID 受験者のID
Q1-Q11 1番目から11番目の解答結果 (0 or 1)

Q4.1 colMeans()関数を使って、Q1からQ11それぞれの正答率を計算しなさい。

library(ltm)
  • データを読み込む
df_irt <- read_csv("data/irt_exercise_4.1.csv")
  • Q1 から Q11 までの合計点を表す変数 total を作る
df_irt <- df_irt |> 
  dplyr::mutate(total = rowSums(dplyr::across(Q1:Q11), 
    na.rm = TRUE))               # 欠損値(NA)があっても無視して合計するよう指定
  • データフレーム df_irt を確認する
DT::datatable(df_irt)
  • 正答率 (Correct Response Rate: crr)を計算
crr1 <- colMeans(x = df_irt[3:13],
  na.rm = TRUE)
crr1
       Q1        Q2        Q3        Q4        Q5        Q6        Q7        Q8 
0.9384615 0.8000000 0.7031250 0.6718750 0.2187500 0.7076923 0.9692308 0.8750000 
       Q9       Q10       Q11 
0.7692308 0.8000000 0.6153846 
  • ここで得られた結果 crr1 は「名前付きの数値ベクトル」: named numeric vector
    → 使い勝手が悪いので、このベクトルをデータフレームに変換する
df_crr1 <- data.frame(      # データフレーム名を指定(ここでは df_crr と指定)
  item = names(crr1),       # 変数名を指定(ここでは item と指定)
  seikai = as.numeric(crr1) # 変数名を指定(ここでは seikai と指定)
)
  • データフレームを確認
df_crr1
   item    seikai
1    Q1 0.9384615
2    Q2 0.8000000
3    Q3 0.7031250
4    Q4 0.6718750
5    Q5 0.2187500
6    Q6 0.7076923
7    Q7 0.9692308
8    Q8 0.8750000
9    Q9 0.7692308
10  Q10 0.8000000
11  Q11 0.6153846
  • 正答率が低い順位並べ変えて表示させる
  • seikai の値順に因子の順序を指定
df_crr1$item <- factor(df_crr1$item, 
  levels = df_crr1$item[order(df_crr1$seikai)])
ggplot(df_crr1, aes(x = seikai, y = item)) +
  geom_bar(stat = "identity", fill = "skyblue") +
  geom_text(aes(label = round(seikai, 2)),  # 小数第2位で丸める
            hjust = 1.2, size = 4) +        # 棒の内側に表示
  labs(
    title = "各項目の正答率",
    x = "項目",
    y = "正答率"
  ) +
  theme_minimal() +
  theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策  

  • item3が最も正答率が低く(55%)、item1の正答率が最も高い (92%)

Q4.2 cor()関数を使って、素点 (Q1Q11) と合計点 total との相関を計算し、除外する必要のある問題等を指摘しなさい。

  • 分析に使うデータフレームを確認する
DT::datatable(df_irt)
it_1 <- cor(x = df_irt[, 3:13], 
  y = df_irt[, 14],
  use = "pairwise.complete.obs")

it_1
        total
Q1  0.2205236
Q2  0.6584340
Q3  0.6257439
Q4  0.5139615
Q5  0.1458649
Q6  0.3203625
Q7  0.1749797
Q8  0.6140165
Q9  0.3613183
Q10 0.6398342
Q11 0.6999322
  • ここで得られた結果 it_1 は「「行名付きの1列行列(matrix)」

→ 使い勝手が悪いので、この matrix をデータフレームに変換して、行名を項目名の列として追加する

# 行列をデータフレームに変換
df_it_1 <- as.data.frame(it_1)

# 行名を項目名として列に追加
df_it_1$item <- rownames(df_it_1)

# 列名をわかりやすく変更(オプション)
colnames(df_it_1) <- c("correlation", "item")
DT::datatable(df_it_1)
  • 相関係数が低い順位並べ変えて表示させてみる
  • correlation の値順に因子の順序を指定
df_it_1$item <- factor(df_it_1$item, 
  levels = df_it_1$item[order(df_it_1$correlation)])
ggplot(df_it_1, aes(x = item, y = correlation)) +
  geom_bar(stat = "identity", fill = "orange") +
  geom_text(aes(label = round(correlation, 3)), 
    vjust = -0.5, size = 4) +
  ylim(0, 0.7) +
  labs(
    title = "項目-合計相関(item-total correlation)",
    x = "項目",
    y = "相関係数"
  ) +
  theme_minimal() +
  theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策  

  • 素点 (item1item5) と各項目得点 (total) との相関は 0.36〜0.61の間

I-T相関の計算のポイント ・各項目への反応 (Q1 〜 Q11) と合計点 (total) との間にI-T 相関が認められるかどうか

IT相関の値 評価 項目の扱い
〜 0.2 極めて低い(要注意) 除外を検討する
0.2〜0.3 やや低い 内容によって再検討
0.3〜0.4 妥当なレベル 保留・文脈による判断
0.4以上 良好(望ましい) 採用して問題なし
  • I-T相関が 0.2 以下の Q5 と Q7 を除外
  • I-T相関が 0.221 の Q1 は内容によって再検討
  • それ以外の項目は問題なし

est()関数を使って、2 パラメタ・ロジスティックモデル (2PL: 一般化ロジスティックモデル) で項目母数(識別力と困難度)を推定し、次の問いに答えなさい。

  1. 識別力は高い、中程度、低い?
  2. 困難度は高い、中程度、低い?
  3. 最も簡単な問題
  4. 最も難しい問題
  5. 最も能力を敏感に識別する問題
  6. 最も能力を敏感に識別しない問題
  7. 最も推定精度の高い問題
  8. 最も推定精度の低い問題
  • 分析で使うデータフレームを確認する
DT::datatable(df_irt)
ex1 <- est(resp = df_irt[, 3:13], # テストデータを指定する引数
  model = "2PL",        # 2PLMを仮定
  engine = "ltm") # ltmパッケージを利用して項目母数を推定すると指定

ex1
$est
          [,1]       [,2] [,3]
Q1   0.8903135 -3.4384464    0
Q2   2.4444466 -1.0340746    0
Q3   1.4913685 -0.8048831    0
Q4   1.0379131 -0.8385596    0
Q5  -0.2678490 -4.8257655    0
Q6   0.2079933 -4.2995429    0
Q7   0.3560097 -9.8629691    0
Q8   3.2230888 -1.3129353    0
Q9   0.4729782 -2.6736123    0
Q10  3.1091149 -0.9653553    0
Q11  5.8745464 -0.3197006    0

$se
            [,1]       [,2] [,3]
 [1,]  0.6497539  2.0824740    0
 [2,]  1.0915745  0.2970198    0
 [3,]  0.6768648  0.3439727    0
 [4,]  0.4893676  0.4320297    0
 [5,]  0.3700716  6.5589765    0
 [6,]  0.3287564  6.7760695    0
 [7,]  0.8370542 22.4835341    0
 [8,]  1.6411698  0.3032655    0
 [9,]  0.3835592  2.0638826    0
[10,]  1.8800859  0.2290825    0
[11,] 14.1253172  0.1497608    0

$vcm
$vcm[[1]]
          [,1]     [,2]
[1,] 0.4221801 1.293091
[2,] 1.2930908 4.336698

$vcm[[2]]
          [,1]       [,2]
[1,] 1.1915349 0.22109685
[2,] 0.2210969 0.08822073

$vcm[[3]]
          [,1]      [,2]
[1,] 0.4581459 0.1580620
[2,] 0.1580620 0.1183173

$vcm[[4]]
          [,1]      [,2]
[1,] 0.2394807 0.1467043
[2,] 0.1467043 0.1866497

$vcm[[5]]
          [,1]      [,2]
[1,]  0.136953 -2.390121
[2,] -2.390121 43.020173

$vcm[[6]]
          [,1]      [,2]
[1,] 0.1080808  2.184765
[2,] 2.1847648 45.915118

$vcm[[7]]
           [,1]      [,2]
[1,]  0.7006597  18.74337
[2,] 18.7433729 505.50931

$vcm[[8]]
          [,1]       [,2]
[1,] 2.6934384 0.33133729
[2,] 0.3313373 0.09196995

$vcm[[9]]
          [,1]      [,2]
[1,] 0.1471177 0.7515523
[2,] 0.7515523 4.2596113

$vcm[[10]]
          [,1]       [,2]
[1,] 3.5347231 0.19261119
[2,] 0.1926112 0.05247879

$vcm[[11]]
            [,1]        [,2]
[1,] 199.5245851 -0.82359383
[2,]  -0.8235938  0.02242831

項目特性曲線 (ICC) を描いて、わかることをまとめなさい。

P1 <- irf(ip = ex1$est) # irf()関数を使って正答確率を計算  
plot(x = P1,     # xは引数、irf関数で推定した結果を指定する
  co = NA,      # ICCの色を指定/項目毎に異なる色でICCを描く
  label = TRUE) # 各ICCに項目の番号がつく

abline(v = 0, lty    = 2) # x = 0 の縦点線を引く

曲線の形からの判断

理想的な項目: Q8, Q10, Q11   

  • いずれの曲線も急峻で中央に集中

好ましくない項目: Q1, Q6, Q7, Q5

  • いずれの曲線も左に寄っており、かつ平坦
    → 非常に簡単で、識別力が低い

考慮すべきこと・・・標準誤差(SE)

  • 困難度の標準偏差に着目
    ・Q11 の識別力 a の標準偏差が 14.13 → 曲線の形は完璧だが、異常に標準偏差が高い → 使えない
    ・Q5, Q6, Q7 の困難度 b の標準偏差が大きい
項目 識別力a 困難度b コメント
Q5 0.37 6.56 困難度 b のSE (6.56)が非常に大きい → 推定不安定
Q6 0.33 6.78 困難度 b のSE (6.78)が非常に大きい → 推定不安定
Q7 0.84 22.48 困難度 b のSE (22.48)が非常に大きい → 推定不安定
Q11 14.13 0.15 困難度 a のSE (14.13)が非常に大きい → 推定不安定

個別問題の検討

採用する問題: Q2, Q3, Q4, Q8, Q10

項目 識別力a aのSE 困難度 b 解釈 判断
Q10 3.11 -0.97 1.88 高能力層に強い安定 採用
Q8 3.22 -1.31 1.64 高識別でバランスも良い 採用
Q2 2.44 -1.03 1.09 中~上能力層に対応 採用
Q3 1.49 -0.80 0.68 中程度の識別力と安定性。中能力向け 採用
Q4 1.04 -0.84 0.49 安定感があり平均的な難易度 採用

→ 識別力が非常に高く、難易度も中程度  

  • Q10の識別力(a = 3.11) > 1 → 能力が高いほど正答率が上がる  
  • Q8の識別力(a = 3.22) > 1 → 能力が高いほど正答率が上がる
  • Q4の識別力(a = 1.04) > 1 → Q10やQ8程の識別力はない

選ばない方がよい問題:Q11, Q5, Q7, Q6, Q9

項目 識別力 a a のSE 困難度 b 解釈 判断
Q11 5.87 14.13 -0.32 a は高いが(5.87)、SE が高すぎ(14.13) 不採用
Q5 -0.27 0.37 -4.83 識別力がマイナス => 常に正答 不採用
Q7 0.36 0.84 -9.86 識別力が低い+簡単すぎ → ほぼ正答 不採用
Q6 0.21 0.33 -4.30 識別力が極端に低い+効果がない項目 不採用
Q9 0.47 0.38 -2.67 識別力が境界値。簡単過ぎ 不採用
  • 「Q5の識別力(a = -0.27)< 0」 → 能力が高いほど正答率が下がる
    → 不適切な挙動が見られるため除外すべき

項目を選んで項目特性曲線 (ICC) を描くコマンド

  • 例えば、上のQ11, Q5, Q7, Q6, Q9の項目だけを選んで ICC を描くコマンドは次のとおり
# パラメータ定義(2PLモデル:a = 識別力、b = 困難度)
params <- data.frame(
  Item = c("Q11", "Q5", "Q6", "Q7", "Q9"),
  a = c(5.8745464, -0.2678490, 0.2079933, 0.3560097, 0.4729782),
  b = c(-0.3197006, -4.8257655, -4.2995429, -9.8629691, -2.6736123)
)

# θ(能力値)の範囲を作成
theta <- seq(-4, 4, length.out = 300)

# 項目ごとの P(θ) を計算
icc_data <- do.call(rbind, lapply(1:nrow(params), function(i) {
  a <- params$a[i]
  b <- params$b[i]
  item <- params$Item[i]
  p_theta <- 1 / (1 + exp(-a * (theta - b)))
  data.frame(theta = theta, P = p_theta, Item = item)
}))

# ggplotで描画
ggplot(icc_data, aes(x = theta, y = P, color = Item)) +
  geom_line(size = 1.2) +
  labs(
    title = "Q11, Q5, Q7, Q6, Q9 の項目特性曲線(2PLモデル)",
    x = "能力値 θ",
    y = "正答確率 P(θ)"
  ) +
  ylim(0, 1.05) +
  theme_minimal() +
  theme_bw(base_family = "HiraKakuProN-W3") # 文字化け対策